<?php

namespace Maestros\Controller\Service;

use Zend\Db\Adapter\Adapter;
use Componentes\Controller\UtilsArrayController;
use Maestros\Model\Entity\Bloque;
use Maestros\Controller\Service\GenericService;
use Maestros\Model\Dao\BloqueDAO;
use Maestros\Controller\Service\HoraService;
use Maestros\Controller\Service\DiaService;

//SERVICIO
class BloqueService extends GenericService {

    /**
     * @var Zend\Db\Adapter\Adapter 
     */
    private $dbAdapter;
    private static $bloqueService;

    /**
     * @param \Zend\Db\Adapter\Adapter $dbAdapter
     */
    private function __construct(Adapter $dbAdapter) {
        $this->dbAdapter = $dbAdapter;
    }

    public static function getInstance($adapter) {
        if (self::$bloqueService == null) {
            self::$bloqueService = new BloqueService($adapter);
        }
        return self::$bloqueService;
    }

    public function getBloqueDao() {
        return BloqueDAO::getInstance($this->dbAdapter);
    }

    /**
     * @param type $id
     * @return type Array
     */
    public function getRegistro($id) {
        $data = null;
        $success = false;
        $mensaje = 'BLOQUE NO ENCONTRADO';
        $bloque = $this->obtenerBloqueSegunId($id);
        if ($bloque->getId() != null) {
            $data[0] = $bloque->objectToArray();
            $mensaje = 'BLOQUE ENCONTRADO';
            $success = true;
        }
        return $this->setOuput($success, $data, $mensaje);
        //return UtilsArrayController::organizarOutput($success, $data, null);
    }

    /**
     * @param type Bloque
     * @return type Array
     */
    public function getIds($bloque) {
        $mensaje = 'BLOQUE NO REGISTRADO';
        $data = null;
        $success = false;
        $servicioHora = HoraService::getInstance($this->dbAdapter);
        $hora = $servicioHora->getRegistro($bloque->getHora());
        $servicioDia = DiaService::getInstance($this->dbAdapter);
        $dia = $servicioDia->getRegistro($bloque->getDia());
        if ($bloque->getId() != null){
            $success = true;
            $data[0] = $bloque->objectToArray();            
            $data[0]['_dia'] = $dia['data'][0]['id'];
            $data[0]['_hora'] = $hora['data'][0]['id'];
            $data[0]['_turno'] = $hora['data'][0]['_turno'];
            $mensaje = 'BLOQUE ENCONTRADO';
        }
        return $this->setOuput($success, $data, $mensaje);
    }

    /**
     * @param type Bloque
     * @return type Array
     */
    public function armarRegistroCompleto($bloque) {
        $mensaje = 'BLOQUE NO REGISTRADO';
        $data = null;
        $success = false;
        $servicioHora = HoraService::getInstance($this->dbAdapter);
        $hora = $servicioHora->getRegistroCompleto($bloque->getHora());
        $servicioDia = DiaService::getInstance($this->dbAdapter);
        $dia = $servicioDia->getRegistro($bloque->getDia());
        if ($bloque->getId() != null){
            $success = true;
            $data[0] = $bloque->objectToArray();            
            $data[0]['_hora'] = $hora['data'][0];
            $data[0]['_dia'] = $dia['data'][0];
            $mensaje = 'BLOQUE ENCONTRADO';
        }
        return $this->setOuput($success, $data, $mensaje);
    }

    /**
     * @param type Id
     * @return type array
     */
    public function getRegistroCompleto($id) {
        $bloque = $this->obtenerBloqueSegunId($id);
        return $this->armarRegistroCompleto($bloque);
    }

    /**
     * @param type Id
     * @return type array
     */
    public function obtenerIdsBloque($id) {
        $bloque = $this->obtenerBloqueSegunId($id);
        return $this->getIds($bloque);
    }

    /**
     * @param type Id
     * @return type Objet
     */
    public function obtenerBloqueSegunId($id) {
        $registros = $this->getBloqueDao()->getRegistro($id);
        $data = UtilsArrayController::llenarData($registros);
        $bloque = new Bloque($data[0]);
        $bloque->setDia($data[0]['id_dia']);
        $bloque->setHora($data[0]['id_hora']);
        return $bloque;
    }
    
    /**
     * @param type Array
     * @return type Array
     */
    public function llenarArreglo($registros) {
        foreach ($registros as $row) {
            $bloques[] = array(
                'id' => $row['id'],
            );
        }
        for ($i = 0; $i < count($bloques); $i++) {
            $bloque = $this->getRegistroCompleto($bloques[$i]['id']);
            $bloques[$i] = $bloque['data'];
        }
        return $bloques;
    }
    
    /**
     * @param type Array
     * @return type Array
     */
    public function llenarArregloIds($registros) {
        foreach ($registros as $row) {
            $bloques[] = array(
                'id' => $row['id'],
            );
        }
        for ($i = 0; $i < count($bloques); $i++) {
            $bloque = $this->obtenerIdsBloque($bloques[$i]['id']);
            $bloques[$i] = $bloque['data'];
        }
        return $bloques;
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getRegistrosSegunDia($dia) {
        $mensaje = 'BLOQUES NO REGISTRADOS';
        $success = false;
        $registros = $this->getBloqueDao()->getBloquesSegunDia($dia);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'BLOQUES ENCONTRADOS';
            $bloques = $this->llenarArreglo($registros);
        }
        return $this->setOuput($success, $bloques, $mensaje);
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getRegistrosSegunHora($hora) {
        $mensaje = 'BLOQUES NO REGISTRADOS';
        $success = false;
        $registros = $this->getBloqueDao()->getBloquesSegunHora($hora);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'BLOQUES ENCONTRADOS';
            $bloques = $this->llenarArreglo($registros);
        }
        return $this->setOuput($success, $bloques, $mensaje);
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getIdsSegunDia($dia) {
        $mensaje = 'BLOQUES NO REGISTRADOS';
        $success = false;
        $registros = $this->getBloqueDao()->getBloquesSegunDia($dia);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'BLOQUES ENCONTRADOS';
            $bloques = $this->llenarArregloIds($registros);
        }
        return $this->setOuput($success, $bloques, $mensaje);
    }

    /**
     * @param type Id
     * @return type Array
     */
    public function getIdsSegunHora($hora) {
        $mensaje = 'BLOQUES NO REGISTRADOS';
        $success = false;
        $registros = $this->getBloqueDao()->getBloquesSegunHora($hora);
        if (count($registros) > 0) {
            $success = true;
            $mensaje = 'BLOQUES ENCONTRADOS';
            $bloques = $this->llenarArregloIds($registros);
        }
        return $this->setOuput($success, $bloques, $mensaje);
    }
}